package cn.fscode.code.generator.model.po;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.Optional;

/**
 * 通用的代码生成业务字段表 gen_table_column <br/>
 * <h3>为什么不包含 fieldType 字段?</h3>
 * <p>
 * 在生成时候考虑到会兼容不同语言特性, 语言的字段类型会不一样, 我们总不能在数据库中存放两份数据,
 * 只有字段类型不一样, 这样显然是不合理的, 所以我选择在生成代码的时候生成字段类型
 * </p>
 * <br/>
 * <h3>为什么不包含 fieldName 名呢?</h3>
 * <p>
 * 虽然在绝大数业务场景中, 就拿java来说(其他语言差不多), 字段命名方式一般是驼峰命名法, 但是在一些
 * 特殊行业中, 有可能不是完全遵循驼峰命名法, 所以 fieldName 这里也是在生成代码时候创建的, 你可以
 * 选择 下划线|驼峰命名法|拼音命名法
 * </p>
 * @author shenguangyang
 */
@Getter
@Setter
@TableName("gen_table_column")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GenTableColumnPO implements IBasePO {
    private static final long serialVersionUID = 1L;

    /**
     * 编号
     */
    @TableId
    private Long id;

    /**
     * 归属表编号
     */
    private Long tableId;

    /**
     * 列名称
     */
    private String columnName;

    /**
     * 列描述
     */
    private String columnComment;

    /**
     * 列类型
     */
    private String columnType;
    /**
     * 列长度
     */
    private Integer columnLength;
    /**
     * 列小数点
     */
    private Integer columnScale;

    /**
     * 字段类型
     * @deprecated
     */
    @TableField(exist = false)
    private String fieldType;

    /**
     * 字段名
     * @deprecated
     */
    @TableField(exist = false)
    private String fieldName;

    /**
     * 是否主键
     */
    private Boolean isPk = Boolean.FALSE;

    /**
     * 是否自增
     */
    private Boolean isIncrement;

    /**
     * 是否可以为空
     */
    private Boolean isNullable;

    /**
     * 是否为插入字段
     */
    private Boolean isInsert = Boolean.TRUE;

    /**
     * 是否编辑字段
     */
    private Boolean isEdit = Boolean.TRUE;

    /**
     * 是否列表字段
     */
    private Boolean isList = Boolean.TRUE;

    /**
     * 是否查询字段
     */
    private Boolean isQuery = Boolean.FALSE;

    /**
     * 查询方式（EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围）
     */
    private String queryType;

    /**
     * 显示类型（input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件）
     */
    private String htmlType;

    /**
     * 字典类型
     */
    private String dictType;

    /**
     * 排序
     */
    private Integer sort;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public void setIsInsert(Boolean insert) {
        isInsert = Optional.ofNullable(insert).orElse(isInsert);
    }

    public void setIsEdit(Boolean edit) {
        isEdit = Optional.ofNullable(edit).orElse(isEdit);
    }

    public void setIsList(Boolean list) {
        isList = Optional.ofNullable(list).orElse(isList);
    }

    public void setIsQuery(Boolean query) {
        isQuery = Optional.ofNullable(query).orElse(Boolean.FALSE);
    }
}
